<?php

include "application/classes/model/CandidatoDAO.php";
include "application/classes/model/EnderecoDAO.php";
include "application/classes/model/CurriculoDAO.php";
include "application/classes/model/AtividadeComplementarDAO.php";
include "application/classes/model/AtividadeDAO.php";
include "application/classes/model/ComunicacaoDAO.php";
include "application/classes/model/CursoDAO.php";
include "application/classes/model/DeficienciaDAO.php";
include "application/classes/model/DificuldadeDevidoDeficienciaIntelectualDAO.php";
include "application/classes/model/EmpresaDAO.php";
include "application/classes/model/EscolaridadeDAO.php";
include "application/classes/model/ExperienciaProfissionalDAO.php";
include "application/classes/model/IdiomaDAO.php";
include "application/classes/model/InformaticaDAO.php";
include "application/classes/model/PalestraDAO.php";
include "application/classes/model/VoluntariadoDAO.php";
defined('SYSPATH') OR die('No Direct Script Access');

class CandidatoCurriculoRegister{
	/****************
	 * ATRIBUTOS
	 ***************/

	private $candidato;
	private $endereco;
	private $deficiencias;
	private $escolaridade;
	private $idioma;
	private $comunicacao;
	private $informatica;
	private $experienciaProfissional;
	private $areaDeInteresse;
	private $atividadesComplementares;
	private $OperacaoRealizada;
	private $mensagemStatusInsercao;

	/****************
	 * CONSTRUTOR
	 ***************/
	
	public function CandidatoCurriculoRegister($candidato = null, $endereco = null, $deficiencias = null, $escolaridade = null, $idiomas = null,
	$comunicacao = null, $informatica = null, $experienciaProfissional = null, $areaDeInteresse = null, $atividadesComplementares = null){
		
		$this->candidato = $candidato;
		$this->endereco = $endereco;
		$this->deficiencias = $deficiencias;
		$this->escolaridade = $escolaridade;
		$this->idiomas = $idiomas;
		$this->comunicacao = $comunicacao;
		$this->informatica = $informatica;
		$this->experienciaProfissional = $experienciaProfissional;
		$this->areaDeInteresse = $areaDeInteresse;
		$this->atividadesComplementares = $atividadesComplementares;
		
		$this->OperacaoRealizada = false;
		$this->mensagemStatusInsercao = "";
	}

	/****************
	 * METODOS
	 ***************/

	public function persistirCurriculo(){
		$this->setMensagemStatus("Cadastro Efetuado com sucesso");
		//Obtendo os Objetos DAO para persistência do curriculo
		//Começando pelo topo do modelo que é o candidato composto por seu emdereço
		$candidatoDAO = ORM::factory('candidatodao');
		$enderecoDAO = ORM::factory('enderecodao');

		$candidatoDAO->nome = $this->candidato->getNome();
		$candidatoDAO->email = $this->candidato->getEMail();
		$candidatoDAO->dataDeNascimento = $this->candidato->getDataDeNascimento();
		$candidatoDAO->sexo = $this->candidato->getSexo();
		$candidatoDAO->estadoCivil = $this->candidato->getEstadoCivil();
		$candidatoDAO->telefoneResidencial = $this->candidato->getTelefoneResidencial();
		$candidatoDAO->telefoneCelular = $this->candidato->getTelefoneCelular();
		$candidatoDAO->telefoneAuxiliar = $this->candidato->getOutrosTelefones();
		$candidatoDAO->rg = $this->candidato->getRg();
		$candidatoDAO->cpf = $this->candidato->getCpf();
		$candidatoDAO->candidatoStatus = 'INATIVO';
		$candidatoDAO->idade = DateUtil::calcularIdade($this->candidato->getDataDeNascimento());
		$enderecoDAO->estado = $this->endereco->getEstado();
		$enderecoDAO->cidade = $this->endereco->getCidade();
		$enderecoDAO->rua = $this->endereco->getRua();
		$enderecoDAO->numero = $this->endereco->getNumero();
		$enderecoDAO->complemento = $this->endereco->getComplemento();
		$enderecoDAO->bairro = $this->endereco->getBairro();
		$enderecoDAO->cep = $this->endereco->getCep();
		$enderecoDAO->pais = $this->endereco->getPais();

		//salva o endereço e automaticamente obtém a id inserida através de uma forma de last_insert_id()
		$enderecoDAO->save();

		//verifica se o endereço foi salvo com sucesso no banco de dados
		if($enderecoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:92:BD:endereco");
		}

		//Atribuindo o endereço ao candidato - Associação um-para-um
		$candidatoDAO->endereco_idEndereco = $enderecoDAO->idEndereco;

		//Instanciação do curriculo que sera usado a seguir nas associações dos formulários
		$curriculoDAO = ORM::factory('curriculodao');

		$curriculoDAO->areaDeInteresse = $this->areaDeInteresse;

		//TODO - erro de modelo, informações adicionais ou complementares pertence ao curriculo e não a atividade
		//Corrigir erro no modelo
		$curriculoDAO->informacoesComplementares = $this->atividadesComplementares->getInformacoesComplementares();

		//salva o curriculo e automaticamente obtém a id inserida através de uma forma de last_insert_id()
		$curriculoDAO->save();

		//verifica se o curriculo foi salvo com sucesso no banco de dados
		if($curriculoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:116:BD:curriculo");
		}

		//aplicando as relações em candidato com curriculo de um-para-um com curriculo
		$candidatoDAO->curriculo_idCurriculo = $curriculoDAO->idCurriculo;

		//Não há mais relações associadas ao candidato daqui para frente
		//O candidato pode ser salvo em definitivo no Banco de Dados
		$candidatoDAO->save();

		//verifica se o candidato foi salvo com sucesso no banco de dados
		if($candidatoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:132:BD:candidato");
		}

		//Tentativa de adicionar deficiências captadas em um curriculo, havendo conhecimento que a chave estrangeira
		//está nas tablela filhas referenciando o id da tabela pai na relação de um-para-muitos
		//é adicionado esta ligação através do id obtido do curriculo que foi inserido acima
		//TODO pensar no ideal - talvez fosse melhor delegar ao DeficienciaDAO que conhece as suas associações
		//e dividir com os DAOs de dominio o trabalho de persistência que se encontra todo aqui
		//Atualmente as associações estão sendo realizadas praticamente manualmente, porém evitando as querys
		//usando a solução ORM do Kohana 3
		foreach ($this->deficiencias as $deficiencia){
			//a deficiencia foi previamente serializada no controle do formularia de deficiência - realizando a desserialização
			$defCorrente = unserialize($deficiencia);
			$deficienciaDAO = ORM::factory('deficienciadao');
			//verificando qual campo foi preenchido devido ao tipo diferente de deficiência
			//TODO modelo alterado de forma a generalizar e melhorar este modelo
			//@post: Impacto de implementação - deverá levar de 1 a 3 dias para implementar novo modelo
			if($defCorrente->getTipoDeficiencia() != null && $defCorrente->getTipoDeficiencia() != ""){
				$deficienciaDAO->tipoDeDeficiencia = $defCorrente->getTipoDeficiencia();
			}
			if($defCorrente->getModalidadeDaDeficiencia() != null && $defCorrente->getModalidadeDaDeficiencia() != ""){
				$deficienciaDAO->modalidadeDaDeficiencia = $defCorrente->getModalidadeDaDeficiencia();
			}
			if($defCorrente->getIntensidadeDaDeficiencia() != null && $defCorrente->getIntensidadeDaDeficiencia() != ""){
				$deficienciaDAO->intensidadeDaDeficiencia = $defCorrente->getIntensidadeDaDeficiencia();
			}
			if($defCorrente->getOutraModalidadeDeficiencia() != null && $defCorrente->getOutraModalidadeDeficiencia() != ""){
				$deficienciaDAO->outraModalidadeDeficiencia = $defCorrente->getOutraModalidadeDeficiencia();
			}
				
			if($defCorrente->getObservacoes() != null && $defCorrente->getObservacoes() != ""){
				$deficienciaDAO->observacoes = $defCorrente->getObservacoes();
			}
			//Para cada deficiencia inserida associo ao curriculo corrente na associação um-para-muitos
			$deficienciaDAO->id_curriculo = $curriculoDAO->idCurriculo;
			//insiro a deficiencia desta rodada no banco de dados
			$deficienciaDAO->save();
				
			//Por culpa do modelo mal feito aparecem coisas estranhas como este freach dentro de outro foreach!
			//Este foi inserido por atualização do modelo pois Hibernate não lida com List de String e sim de EDs criadas
			$qtdDificuldade = count($defCorrente->getDificuldadesDevidoDeficiencia());
			if($defCorrente->getDificuldadesDevidoDeficiencia() != null && $qtdDificuldade > 0){
				$dificuldades = $defCorrente->getDificuldadesDevidoDeficiencia();
				foreach ($dificuldades as $dificuldade){
					$dificuldadeDAO = ORM::factory('dificuldadedevidodeficienciaintelectualdao');
					$dificuldadeDAO->dificuldadeDevidoDeficiencia = $dificuldade->getDificuldadeDevidoDevidoDeficiencia();
					$dificuldadeDAO->deficiencia_Dificuldade = $deficienciaDAO->idDeficiencia;
					$dificuldadeDAO->save(); //será!?^^
						
					if($dificuldadeDAO->saved()){
						$this->setOperacaoRealizada(true);
					}
					else{
						$this->setOperacaoRealizada(true);
						$this->setMensagemStatus("GDC:186:BD:dificuldade");
					}
				}
				//$deficienciaDAO->dificuldadesDevidoDeficiencia = $defCorrente->getDificuldadesDevidoDeficiencia();
			}
				
			//verifico a ocorrencia de erro na inserção em cada rodada
			//Pensar se é necessário break para encerrar o loop imediatamente
			if($deficienciaDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(true);
				$this->setMensagemStatus("GDC:199:BD:deficiencia");
			}
		}

		//Questões levantadas: - Um meio de efetuar um rollback de todas as operações pois caso ocorresse um erro
		//em qualquer uma dessas inserções elas deveriam levar em conta a atomicidade da operação, e aqui ao
		//inserir um candidato a operação deveria ser atômica para o candidato e todos os seus elementos, o
		//que aqui não está garantido

		//Tentativa de inserir as escolaridades, possuindo as mesmas condições e os mesmos erros e problemas de
		//modelo apresentados na inserção de deficiência realizada anteriormente

		foreach ($this->escolaridade as $escolaridade){
			//a escolaridade foi previamente serializada no controle do formularia de deficiência - realizando a desserialização
			$escolaridadeCorrente = unserialize($escolaridade);
			$escolaridadeDAO = ORM::factory('escolaridadedao');
				
			//verificando qual campo foi preenchido devido ao tipo diferente de escolaridades
			//TODO modelo alterado de forma a generalizar e melhorar este modelo
			//@post: Impacto de implementação - deverá levar de 1 a 3 dias para implementar novo modelo
			if($escolaridadeCorrente->getEscolaridade() != null && $escolaridadeCorrente->getEscolaridade() != ""){
				$escolaridadeDAO->escolaridade = $escolaridadeCorrente->getEscolaridade();
			}
			if($escolaridadeCorrente->getGrauDaEscolaridade() != null && $escolaridadeCorrente->getGrauDaEscolaridade() != ""){
				$escolaridadeDAO->grauDaEscolaridade = $escolaridadeCorrente->getGrauDaEscolaridade();
			}
			if($escolaridadeCorrente->getAnoDeConclusao() != null && $escolaridadeCorrente->getAnoDeConclusao() != ""){
				$escolaridadeDAO->anoDeConclusao = $escolaridadeCorrente->getAnoDeConclusao();
			}
			if($escolaridadeCorrente->getInstituicao() != null && $escolaridadeCorrente->getInstituicao() != ""){
				$escolaridadeDAO->instituicao = $escolaridadeCorrente->getInstituicao();
			}
			if($escolaridadeCorrente->getCurso() != null && $escolaridadeCorrente->getCurso() != ""){
				$escolaridadeDAO->curso = $escolaridadeCorrente->getCurso();
			}
			if($escolaridadeCorrente->getTipoDeEnsinoMedio() != null && $escolaridadeCorrente->getTipoDeEnsinoMedio() != ""){
				$escolaridadeDAO->tipoDeEnsinoMedio = $escolaridadeCorrente->getTipoDeEnsinoMedio();
			}
			if($escolaridadeCorrente->getTipoDeEnsinoPosGraduacao() != null && $escolaridadeCorrente->getTipoDeEnsinoPosGraduacao() != ""){
				$escolaridadeDAO->tipoDeEnsinoPosGraduacao = $escolaridadeCorrente->getTipoDeEnsinoPosGraduacao();
			}
			//Para cada escolaridade inserida associo ao curriculo corrente na associação um-para-muitos
			$escolaridadeDAO->id_curriculo = $curriculoDAO->idCurriculo;
			//insiro a escolaridade desta rodada no banco de dados
			$escolaridadeDAO->save();
				
			if(!$escolaridadeDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:247:BD:idioma");
			}
		}

		//Tentativa de inserir os idiomas, possuindo um modelo melhor definido com a captura de modelo baseado no modelo visual de
		//formulário do mesmo - curriculo com idiomas segue o modelo um-para-muitos
		foreach ($this->idiomas as $idioma){
			//o idioma foi previamente serializado no controle do formulario de deficiência - realizando a desserialização
			$idiomaCorrente = unserialize($idioma);
			//Representação do banco de dados em objeto
			$idiomaDAO = ORM::factory('idiomadao');
				
			$idiomaDAO->nomeDoIdioma = $idiomaCorrente->getNomeDoIdioma();
			$idiomaDAO->le = $idiomaCorrente->getLe();
			$idiomaDAO->escreve = $idiomaCorrente->getEscreve();
			$idiomaDAO->fala = $idiomaCorrente->getFala();
			$idiomaDAO->entende = $idiomaCorrente->getEntende();
			//Para cada idioma inserido associo ao curriculo corrente na associação um-para-muitos
			$idiomaDAO->id_curriculo = $curriculoDAO->idCurriculo;
			//insiro o idioma desta rodada no banco de dados
			$idiomaDAO->save();
				
			if(!$idiomaDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:271:BD:idioma");
			}
		}

		//Tentativa de inserir a comunicação seguindo o modelo de um-para-muitos com relação ao curriculo
		foreach ($this->comunicacao as $comunicacao){
			$comunicacaoCorrente = unserialize($comunicacao);
			$comunicacaoDAO = ORM::factory('comunicacaodao');
				
			$comunicacaoDAO->meioDeComunicacao = $comunicacaoCorrente->getMeioDeComunicacao();
			if($comunicacaoCorrente->getOutros() != null && $comunicacaoCorrente->getOutros() != ""){
				$comunicacaoDAO->outros = $comunicacaoCorrente->getOutros();
			}
			//Para cada comunicação inserida associo ao curriculo corrente na associação um-para-muitos
			$comunicacaoDAO->comunicacao_idCurriculo = $curriculoDAO->idCurriculo;
			//insiro a comunicação desta rodada no banco de dados
			$comunicacaoDAO->save();
				
			if(!$comunicacaoDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:291:BD:comunicacao");
			}
		}

		//Tentativa de inserção de informática, segue o mesmo modelo de idioma
		//elaboração de modelo e implementação mais simplificados
		//objetos serializados e o array de objetos em seguida também serializados como todos os anteriores
		foreach ($this->informatica as $informatica){
			$informaticaCorrente = unserialize($informatica);
			$informaticaDAO = ORM::factory('informaticadao');
				
			$informaticaDAO->conhecimentoEmInformatica = $informaticaCorrente->getConhecimentoEmInformatica();
			$informaticaDAO->nivelDoConhecimento = $informaticaCorrente->getNivelDoConhecimento();
			$informaticaDAO->id_curriculo = $curriculoDAO->idCurriculo;
			$informaticaDAO->save();
				
			if(!$informaticaDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:309:BD:informatica");
			}
		}

		//Tentativa de adicionar os um-para-um com uma profundidade de relação maior a aqual a relação da ligação
		//seguinte é de um-para-muitos
		//Esta é uma correção de modelo imlementada com o propósito de generalizar e diminuir acoplamento e
		//complexidade
		//A correção de modelo aqui feita é sugerida para Escolaridade e Deficiência


		$experienciaProfissionalDAO = ORM::factory('experienciaprofissionaldao');
		$experienciaProfissionalDAO->possuiExperiencia = $this->experienciaProfissional->getPossuiExperiencia();

		//salva o experiência e automaticamente obtém a id inserida através de uma forma de last_insert_id()
		//que será usada para realizar as associações
		$experienciaProfissionalDAO->save();

		if($experienciaProfissionalDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:332:BD:experiencia");
		}

		//Verificando se há empresas em experiencia profissional e caso houver realizar as devidas associações
		//com a id de experiência obtida antes e inserir as empresas no Banco de Dados

		foreach ($this->experienciaProfissional->getEmpresas() as $empresa){
				
			$empresaDAO = ORM::factory('empresadao');
			if($empresa->getNomeEmpresa() != ""){
				$empresaDAO->nomeEmpresa = $empresa->getNomeEmpresa();
				$empresaDAO->cargo = $empresa->getCargo();
				$empresaDAO->periodoInicio = $empresa->getPeriodoInicio();
				$empresaDAO->periodoFinal = $empresa->getPeriodoFinal();
				$empresaDAO->observacao = $empresa->getObservacao();

				//Realizando a associação de um-para-muitos de experienciaProfissional com Empresas
				$empresaDAO->empresas_idExperienciaProfissional = $experienciaProfissionalDAO->idExperienciaProfissional;
				$empresaDAO->save();

				if($empresaDAO->saved()){
					$this->setOperacaoRealizada(true);
				}
				else{
					$this->setOperacaoRealizada(false);
					$this->setMensagemStatus("GDC:357:BD:empresa");
				}
			}
		}

		//como o curriculo possui uma associação de um-para-um com uma experiencia,
		//realizo a associação dela e suas empresas participantes
		//O curriculo foi instanciado como objeto DAO a partir do Banco de Dados na linha 161
		$curriculoDAO->experienciasProfissional_idExperienciaProfissional = $experienciaProfissionalDAO->idExperienciaProfissional;
		$curriculoDAO->save();

		if($curriculoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:373:BD:curriculo");
		}


		//Entender melhor o Kohana, pois esta variável foi criada a principio para satizfazer o kohana,
		//que precisa ter um dado na tabela para inserir no Banco de Dados
		$possuiAtividade = "nao";

		$qtdCursos = count($this->atividadesComplementares->getCursos());
		$qtdAtividades = count($this->atividadesComplementares->getPalestras());
		$qtdVoluntariados = count($this->atividadesComplementares->getVoluntariados());
		$qtdAtividadesComplementares = count($this->atividadesComplementares->getAtividadesComplementares());

		if($qtdCursos > 0 || $qtdAtividades > 0 || $qtdVoluntariados > 0 || $qtdAtividadesComplementares > 0){
			$possuiAtividade = "sim";
		}

		$atividadeDAO = ORM::factory('atividadedao');


		$atividadeDAO->possuiAtividade = $possuiAtividade;

		//Salva no banco de dados e obtém a id do objeto inserido para realizar as assiciações
		$atividadeDAO->save();

		if($atividadeDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:403:BD:atividade");
		}

		//Salvando a recém inserida atividade no curriculo pois a atividades possui associacao de um-para-um
		//Atividade como container de Atividades de variados tipos
		$curriculoDAO->atividade_idAtividades = $atividadeDAO->idAtividades;
		$curriculoDAO->save();

		if($curriculoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:416:BD:curriculo");
		}

		//Tentativa de inserir as Palestras da atividade - associação um para muitos
		//Modelo de implementação sugerida e realizada de acordo com os diagramas
		foreach ($this->atividadesComplementares->getPalestras() as $palestra){
				
			$palestraDAO = ORM::factory('palestradao');
			$palestraDAO->tituloDaPalestra = $palestra->getTituloPalestra();
			$palestraDAO->palestras_idAtividades = $atividadeDAO->idAtividades;
			$palestraDAO->save();
				
			if($palestraDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:433:BD:palestra");
			}
		}

		foreach ($this->atividadesComplementares->getCursos() as $curso){

			$cursoDAO = ORM::factory('cursodao');
			$cursoDAO->nomeDaAtividade = $curso->getNomeDoCurso();
			$cursoDAO->atividade_fk = $atividadeDAO->idAtividades;
			$cursoDAO->save();
				
			if($cursoDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:449:BD:curso");
			}
		}

		foreach ($this->atividadesComplementares->getVoluntariados() as $voluntatiado){
			$voluntariadoDAO = ORM::factory('voluntariadodao');
			$voluntariadoDAO->nomeDaFuncao = $voluntatiado->getNomeDaFuncao();
			$voluntariadoDAO->voluntariados_idAtividades = $atividadeDAO->idAtividades;
			$voluntariadoDAO->save();
				
			if($voluntariadoDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:465:BD:voluntariado");
			}
		}

		foreach ($this->atividadesComplementares->getAtividadesComplementares() as $atividadeComplementar){
			$atividadeComplementarDAO = ORM::factory('atividadecomplementardao');
			$atividadeComplementarDAO->nomeDaAtividade = $atividadeComplementar->getNomeDaAtividade();
			$atividadeComplementarDAO->atividadesComplementares_idAtividades = $atividadeDAO->idAtividades;
			$atividadeComplementarDAO->save();

			if($atividadeComplementarDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:479:BD:atividadeComplementar");
			}
		}


	}
	
	//Atualiza o curriculo de um candidato existente	
	public function atualizarCurriculo(){
	$this->setMensagemStatus("Cadastro Atualizado com sucesso");
		echo "<br>CCR:499:MSG:" . $this->getMensagemStatus();
		//Obtendo os Objetos DAO para persistência do curriculo
		//Como aqui será alterado um registro existente, obtenho a abstração DAO do registro a ser alterado do BD
		//a partir de sua chave
		$candidatoDAO = ORM::factory('candidatodao', $this->candidato->getRg());
		
		echo "<br>CCR:505:MSG:" . $this->getMensagemStatus();
		//Modificando os dados pessoais
		$candidatoDAO->nome = $this->candidato->getNome();
		$candidatoDAO->email = $this->candidato->getEMail();
		$candidatoDAO->dataDeNascimento = $this->candidato->getDataDeNascimento();
		$candidatoDAO->sexo = $this->candidato->getSexo();
		$candidatoDAO->estadoCivil = $this->candidato->getEstadoCivil();
		$candidatoDAO->telefoneResidencial = $this->candidato->getTelefoneResidencial();
		$candidatoDAO->telefoneCelular = $this->candidato->getTelefoneCelular();
		$candidatoDAO->telefoneAuxiliar = $this->candidato->getOutrosTelefones();
		//$candidatoDAO->rg = $this->candidato->getRg();
		$candidatoDAO->cpf = $this->candidato->getCpf();
		//$candidatoDAO->candidatoStatus = 'INATIVO';
		$candidatoDAO->idade = DateUtil::calcularIdade($this->candidato->getDataDeNascimento());
		//TODO $candidatoDAO->nacionalidade = $this->candidato->getNacionalidade();
		
		
		//Modificando o endereço
		
		
		$enderecoDAO = ORM::factory('enderecodao', $candidatoDAO->endereco->idEndereco);
		
		$enderecoDAO->rua = $this->endereco->getRua();
		$enderecoDAO->numero = $this->endereco->getNumero();
		$enderecoDAO->bairro = $this->endereco->getBairro();
		$enderecoDAO->cep = $this->endereco->getCep();
		$enderecoDAO->complemento = $this->endereco->getComplemento();
		$enderecoDAO->cidade = $this->endereco->getCidade();
		$enderecoDAO->estado = $this->endereco->getEstado();
		$enderecoDAO->pais = $this->endereco->getPais();
		
		
		$enderecoDAO->save();
		echo "<br>CCR:531:MSG:" . $this->getMensagemStatus();
		//salva o endereço e automaticamente obtém a id inserida através de uma forma de last_insert_id()
		//$enderecoDAO->save();

		//verifica se o endereço foi salvo com sucesso no banco de dados
		/*if($enderecoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:92:BD:endereco");
		}*/

		//Atribuindo o endereço ao candidato - Associação um-para-um
		//$enderecoDAO_idEndereco = $enderecoDAO->idEndereco;

		//Instanciação do curriculo que sera usado a seguir nas associações dos formulários
		$curriculoDAO = ORM::factory('curriculodao', $candidatoDAO->curriculo->idCurriculo);

		$curriculoDAO->areaDeInteresse = $this->areaDeInteresse;

		//TODO - erro de modelo, informações adicionais ou complementares pertence ao curriculo e não a atividade
		//Corrigir erro no modelo
		$curriculoDAO->informacoesComplementares = $this->atividadesComplementares->getInformacoesComplementares();

		//salva o curriculo e automaticamente obtém a id inserida através de uma forma de last_insert_id()
		$curriculoDAO->save();

		//verifica se o curriculo foi salvo com sucesso no banco de dados
		if($curriculoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:116:BD:curriculo");
		}
		echo "<br>CCR:567:MSG:" . $this->getMensagemStatus();	
		//aplicando as relações em candidato com curriculo de um-para-um com curriculo
		//$candidatoDAO->curriculo_idCurriculo = $curriculoDAO->idCurriculo;

		//Não há mais relações associadas ao candidato daqui para frente
		//O candidato pode ser salvo em definitivo no Banco de Dados
		$candidatoDAO->save();

		//verifica se o candidato foi salvo com sucesso no banco de dados
		if($candidatoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:132:BD:candidato");
		}
		
		echo "<br>CCR:584:MSG:" . $this->getMensagemStatus();
		//Tentativa de adicionar deficiências captadas em um curriculo, havendo conhecimento que a chave estrangeira
		//está nas tablela filhas referenciando o id da tabela pai na relação de um-para-muitos
		//é adicionado esta ligação através do id obtido do curriculo que foi inserido acima
		//TODO pensar no ideal - talvez fosse melhor delegar ao DeficienciaDAO que conhece as suas associações
		//e dividir com os DAOs de dominio o trabalho de persistência que se encontra todo aqui
		//Atualmente as associações estão sendo realizadas praticamente manualmente, porém evitando as querys
		//usando a solução ORM do Kohana 3
		foreach ($this->deficiencias as $deficiencia){
			//a deficiencia foi previamente serializada no controle do formularia de deficiência - realizando a desserialização
			$defCorrente = unserialize($deficiencia);
			echo "<br>CCR:602:DEFID: " . $defCorrente->getIdDeficiencia();
			
			if($defCorrente->getIdDeficiencia() != 0){
				echo "<br>CCR:604:IFDEF: " . $defCorrente->getIdDeficiencia();
				
				$deficienciaDAO = ORM::factory('deficienciadao', $defCorrente->getIdDeficiencia());
				
				//verificando qual campo foi preenchido devido ao tipo diferente de deficiência
				//TODO modelo alterado de forma a generalizar e melhorar este modelo
				//@post: Impacto de implementação - deverá levar de 1 a 3 dias para implementar novo modelo
				if($defCorrente->getTipoDeficiencia() != null && $defCorrente->getTipoDeficiencia() != ""){
					$deficienciaDAO->tipoDeDeficiencia = $defCorrente->getTipoDeficiencia();
				}
				if($defCorrente->getModalidadeDaDeficiencia() != null && $defCorrente->getModalidadeDaDeficiencia() != ""){
					$deficienciaDAO->modalidadeDaDeficiencia = $defCorrente->getModalidadeDaDeficiencia();
				}
				if($defCorrente->getIntensidadeDaDeficiencia() != null && $defCorrente->getIntensidadeDaDeficiencia() != ""){
					$deficienciaDAO->intensidadeDaDeficiencia = $defCorrente->getIntensidadeDaDeficiencia();
				}
				if($defCorrente->getOutraModalidadeDeficiencia() != null && $defCorrente->getOutraModalidadeDeficiencia() != ""){
					$deficienciaDAO->outraModalidadeDeficiencia = $defCorrente->getOutraModalidadeDeficiencia();
				}
					
				if($defCorrente->getObservacoes() != null && $defCorrente->getObservacoes() != ""){
					$deficienciaDAO->observacoes = $defCorrente->getObservacoes();
				}
				//Para cada deficiencia inserida associo ao curriculo corrente na associação um-para-muitos
				//$deficienciaDAO->id_curriculo = $curriculoDAO->idCurriculo;
				//insiro a deficiencia desta rodada no banco de dados
				$deficienciaDAO->save();
				
				//Por culpa do modelo mal feito aparecem coisas estranhas como este foreach dentro de outro foreach!
				//Este foi inserido por atualização do modelo pois Hibernate não lida com List de String e sim de EDs criadas
				$qtdDificuldade = count($defCorrente->getDificuldadesDevidoDeficiencia());
				echo "<br>CCR:635:QTDDIFICULD: " . $qtdDificuldadea;
				if($defCorrente->getDificuldadesDevidoDeficiencia() != null && $qtdDificuldade > 0){
					$dificuldades = $defCorrente->getDificuldadesDevidoDeficiencia();
					foreach ($dificuldades as $dificuldade){
						
						echo "<br>CCR:638:" . $dificuldade->getIdDificuldade();
						if($dificuldade->getIdDificuldade() != 0){
							echo "<br>CCR:638:IF: " . $dificuldade->getIdDificuldade();
							$dificuldadeDAO = ORM::factory('dificuldadedevidodeficienciaintelectualdao', $dificuldade->getIdDificuldade());
							
							$dificuldadeDAO->dificuldadeDevidoDeficiencia = $dificuldade->getDificuldadeDevidoDevidoDeficiencia();
							//$dificuldadeDAO->deficiencia_Dificuldade = $deficienciaDAO->idDeficiencia;
							$dificuldadeDAO->save(); //será!?^^
						}
						else{
							echo "<br>CCR:638:ELSE: " . $dificuldade->getIdDificuldade();
							$dificuldadeDAO = ORM::factory('dificuldadedevidodeficienciaintelectualdao');
							$dificuldadeDAO->dificuldadeDevidoDeficiencia = $dificuldade->getDificuldadeDevidoDevidoDeficiencia();
							$dificuldadeDAO->deficiencia_Dificuldade = $deficienciaDAO->idDeficiencia;
							$dificuldadeDAO->save(); //será!?^^
						}
						
							
						if($dificuldadeDAO->saved()){
							$this->setOperacaoRealizada(true);
						}
						else{
							$this->setOperacaoRealizada(false);
							$this->setMensagemStatus("GDC:186:BD:dificuldade");
						}
					}
					//$deficienciaDAO->dificuldadesDevidoDeficiencia = $defCorrente->getDificuldadesDevidoDeficiencia();
				}
			}
			else{
				$deficienciaDAO = ORM::factory('deficienciadao');
				echo "<br>CCR:627:MSG:ELSEDEF " . $this->getMensagemStatus();
				//verificando qual campo foi preenchido devido ao tipo diferente de deficiência
				//TODO modelo alterado de forma a generalizar e melhorar este modelo
				//@post: Impacto de implementação - deverá levar de 1 a 3 dias para implementar novo modelo
				if($defCorrente->getTipoDeficiencia() != null && $defCorrente->getTipoDeficiencia() != ""){
					$deficienciaDAO->tipoDeDeficiencia = $defCorrente->getTipoDeficiencia();
				}
				if($defCorrente->getModalidadeDaDeficiencia() != null && $defCorrente->getModalidadeDaDeficiencia() != ""){
					$deficienciaDAO->modalidadeDaDeficiencia = $defCorrente->getModalidadeDaDeficiencia();
				}
				if($defCorrente->getIntensidadeDaDeficiencia() != null && $defCorrente->getIntensidadeDaDeficiencia() != ""){
					$deficienciaDAO->intensidadeDaDeficiencia = $defCorrente->getIntensidadeDaDeficiencia();
				}
				if($defCorrente->getOutraModalidadeDeficiencia() != null && $defCorrente->getOutraModalidadeDeficiencia() != ""){
					$deficienciaDAO->outraModalidadeDeficiencia = $defCorrente->getOutraModalidadeDeficiencia();
				}
					
				if($defCorrente->getObservacoes() != null && $defCorrente->getObservacoes() != ""){
					$deficienciaDAO->observacoes = $defCorrente->getObservacoes();
				}
				//Para cada deficiencia inserida associo ao curriculo corrente na associação um-para-muitos
				$deficienciaDAO->id_curriculo = $curriculoDAO->idCurriculo;
				//insiro a deficiencia desta rodada no banco de dados
				$deficienciaDAO->save();
				
				
			}
			
							
			
				
			//verifico a ocorrencia de erro na inserção em cada rodada
			//Pensar se é necessário break para encerrar o loop imediatamente
			if($deficienciaDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:199:BD:deficiencia");
			}
		}

		echo "<br>CCR:697:MSG:" . $this->getMensagemStatus();
		//Questões levantadas: - Um meio de efetuar um rollback de todas as operações pois caso ocorresse um erro
		//em qualquer uma dessas inserções elas deveriam levar em conta a atomicidade da operação, e aqui ao
		//inserir um candidato a operação deveria ser atômica para o candidato e todos os seus elementos, o
		//que aqui não está garantido

		//Tentativa de inserir as escolaridades, possuindo as mesmas condições e os mesmos erros e problemas de
		//modelo apresentados na inserção de deficiência realizada anteriormente

		foreach ($this->escolaridade as $escolaridade){
			//a escolaridade foi previamente serializada no controle do formularia de deficiência - realizando a desserialização
			$escolaridadeCorrente = unserialize($escolaridade);
			
			if($escolaridadeCorrente->getIdEscolaridade() !=0){
				$escolaridadeDAO = ORM::factory('escolaridadedao', $escolaridadeCorrente->getIdEscolaridade());
				
				//verificando qual campo foi preenchido devido ao tipo diferente de escolaridades
				//TODO modelo alterado de forma a generalizar e melhorar este modelo
				//@post: Impacto de implementação - deverá levar de 1 a 3 dias para implementar novo modelo
				if($escolaridadeCorrente->getEscolaridade() != null && $escolaridadeCorrente->getEscolaridade() != ""){
					$escolaridadeDAO->escolaridade = $escolaridadeCorrente->getEscolaridade();
				}
				if($escolaridadeCorrente->getGrauDaEscolaridade() != null && $escolaridadeCorrente->getGrauDaEscolaridade() != ""){
					$escolaridadeDAO->grauDaEscolaridade = $escolaridadeCorrente->getGrauDaEscolaridade();
				}
				if($escolaridadeCorrente->getAnoDeConclusao() != null && $escolaridadeCorrente->getAnoDeConclusao() != ""){
					$escolaridadeDAO->anoDeConclusao = $escolaridadeCorrente->getAnoDeConclusao();
				}
				if($escolaridadeCorrente->getInstituicao() != null && $escolaridadeCorrente->getInstituicao() != ""){
					$escolaridadeDAO->instituicao = $escolaridadeCorrente->getInstituicao();
				}
				if($escolaridadeCorrente->getCurso() != null && $escolaridadeCorrente->getCurso() != ""){
					$escolaridadeDAO->curso = $escolaridadeCorrente->getCurso();
				}
				if($escolaridadeCorrente->getTipoDeEnsinoMedio() != null && $escolaridadeCorrente->getTipoDeEnsinoMedio() != ""){
					$escolaridadeDAO->tipoDeEnsinoMedio = $escolaridadeCorrente->getTipoDeEnsinoMedio();
				}
				if($escolaridadeCorrente->getTipoDeEnsinoPosGraduacao() != null && $escolaridadeCorrente->getTipoDeEnsinoPosGraduacao() != ""){
					$escolaridadeDAO->tipoDeEnsinoPosGraduacao = $escolaridadeCorrente->getTipoDeEnsinoPosGraduacao();
				}
				//Para cada escolaridade inserida associo ao curriculo corrente na associação um-para-muitos
				//$escolaridadeDAO->id_curriculo = $curriculoDAO->idCurriculo;
				//insiro a escolaridade desta rodada no banco de dados
				$escolaridadeDAO->save();
				
			}
			else{
				$escolaridadeDAO = ORM::factory('escolaridadedao');
				
				//verificando qual campo foi preenchido devido ao tipo diferente de escolaridades
				//TODO modelo alterado de forma a generalizar e melhorar este modelo
				//@post: Impacto de implementação - deverá levar de 1 a 3 dias para implementar novo modelo
				if($escolaridadeCorrente->getEscolaridade() != null && $escolaridadeCorrente->getEscolaridade() != ""){
					$escolaridadeDAO->escolaridade = $escolaridadeCorrente->getEscolaridade();
				}
				if($escolaridadeCorrente->getGrauDaEscolaridade() != null && $escolaridadeCorrente->getGrauDaEscolaridade() != ""){
					$escolaridadeDAO->grauDaEscolaridade = $escolaridadeCorrente->getGrauDaEscolaridade();
				}
				if($escolaridadeCorrente->getAnoDeConclusao() != null && $escolaridadeCorrente->getAnoDeConclusao() != ""){
					$escolaridadeDAO->anoDeConclusao = $escolaridadeCorrente->getAnoDeConclusao();
				}
				if($escolaridadeCorrente->getInstituicao() != null && $escolaridadeCorrente->getInstituicao() != ""){
					$escolaridadeDAO->instituicao = $escolaridadeCorrente->getInstituicao();
				}
				if($escolaridadeCorrente->getCurso() != null && $escolaridadeCorrente->getCurso() != ""){
					$escolaridadeDAO->curso = $escolaridadeCorrente->getCurso();
				}
				if($escolaridadeCorrente->getTipoDeEnsinoMedio() != null && $escolaridadeCorrente->getTipoDeEnsinoMedio() != ""){
					$escolaridadeDAO->tipoDeEnsinoMedio = $escolaridadeCorrente->getTipoDeEnsinoMedio();
				}
				if($escolaridadeCorrente->getTipoDeEnsinoPosGraduacao() != null && $escolaridadeCorrente->getTipoDeEnsinoPosGraduacao() != ""){
					$escolaridadeDAO->tipoDeEnsinoPosGraduacao = $escolaridadeCorrente->getTipoDeEnsinoPosGraduacao();
				}
				//Para cada escolaridade inserida associo ao curriculo corrente na associação um-para-muitos
				$escolaridadeDAO->id_curriculo = $curriculoDAO->idCurriculo;
				//insiro a escolaridade desta rodada no banco de dados
				$escolaridadeDAO->save();
				
			}
			
				
			if(!$escolaridadeDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:247:BD:idioma");
			}
		}

		//Tentativa de inserir os idiomas, possuindo um modelo melhor definido com a captura de modelo baseado no modelo visual de
		//formulário do mesmo - curriculo com idiomas segue o modelo um-para-muitos
		foreach ($this->idiomas as $idioma){
			//o idioma foi previamente serializado no controle do formulario de deficiência - realizando a desserialização
			$idiomaCorrente = unserialize($idioma);
			//Representação do banco de dados em objeto
			
			if($idiomaCorrente->getIdIdioma() != 0){
				
				$idiomaDAO = ORM::factory('idiomadao', $idiomaCorrente->getIdIdioma());				
				$idiomaDAO->nomeDoIdioma = $idiomaCorrente->getNomeDoIdioma();
				$idiomaDAO->le = $idiomaCorrente->getLe();
				$idiomaDAO->escreve = $idiomaCorrente->getEscreve();
				$idiomaDAO->fala = $idiomaCorrente->getFala();
				$idiomaDAO->entende = $idiomaCorrente->getEntende();
				//Para cada idioma inserido associo ao curriculo corrente na associação um-para-muitos
				//$idiomaDAO->id_curriculo = $curriculoDAO->idCurriculo;
				//insiro o idioma desta rodada no banco de dados
				$idiomaDAO->save();
			}
			else{
				$idiomaDAO = ORM::factory('idiomadao');
				
				$idiomaDAO->nomeDoIdioma = $idiomaCorrente->getNomeDoIdioma();
				$idiomaDAO->le = $idiomaCorrente->getLe();
				$idiomaDAO->escreve = $idiomaCorrente->getEscreve();
				$idiomaDAO->fala = $idiomaCorrente->getFala();
				$idiomaDAO->entende = $idiomaCorrente->getEntende();
				//Para cada idioma inserido associo ao curriculo corrente na associação um-para-muitos
				$idiomaDAO->id_curriculo = $curriculoDAO->idCurriculo;
				//insiro o idioma desta rodada no banco de dados
				$idiomaDAO->save();
			}
				
			if(!$idiomaDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:271:BD:idioma");
			}
		}

		//Tentativa de inserir a comunicação seguindo o modelo de um-para-muitos com relação ao curriculo
		foreach ($this->comunicacao as $comunicacao){
			$comunicacaoCorrente = unserialize($comunicacao);
			
			if($comunicacaoCorrente->getIdComunicacao() != 0){
				$comunicacaoDAO = ORM::factory('comunicacaodao', $comunicacaoCorrente->getIdComunicacao());
				
				$comunicacaoDAO->meioDeComunicacao = $comunicacaoCorrente->getMeioDeComunicacao();
				if($comunicacaoCorrente->getOutros() != null && $comunicacaoCorrente->getOutros() != ""){
					$comunicacaoDAO->outros = $comunicacaoCorrente->getOutros();
				}
				//Para cada comunicação inserida associo ao curriculo corrente na associação um-para-muitos
				//$comunicacaoDAO->comunicacao_idCurriculo = $curriculoDAO->idCurriculo;
				//insiro a comunicação desta rodada no banco de dados
				$comunicacaoDAO->save();
			}
			else{
				$comunicacaoDAO = ORM::factory('comunicacaodao');
				
				$comunicacaoDAO->meioDeComunicacao = $comunicacaoCorrente->getMeioDeComunicacao();
				if($comunicacaoCorrente->getOutros() != null && $comunicacaoCorrente->getOutros() != ""){
					$comunicacaoDAO->outros = $comunicacaoCorrente->getOutros();
				}
				//Para cada comunicação inserida associo ao curriculo corrente na associação um-para-muitos
				$comunicacaoDAO->comunicacao_idCurriculo = $curriculoDAO->idCurriculo;
				//insiro a comunicação desta rodada no banco de dados
				$comunicacaoDAO->save();
			}
				
			if(!$comunicacaoDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:291:BD:comunicacao");
			}
		}

		//Tentativa de inserção de informática, segue o mesmo modelo de idioma
		//elaboração de modelo e implementação mais simplificados
		//objetos serializados e o array de objetos em seguida também serializados como todos os anteriores
		foreach ($this->informatica as $informatica){
			$informaticaCorrente = unserialize($informatica);
			
			if($informaticaCorrente->getIdInformatica() != 0){
				$informaticaDAO = ORM::factory('informaticadao', $informaticaCorrente->getIdInformatica());
				
				$informaticaDAO->conhecimentoEmInformatica = $informaticaCorrente->getConhecimentoEmInformatica();
				$informaticaDAO->nivelDoConhecimento = $informaticaCorrente->getNivelDoConhecimento();
				//$informaticaDAO->id_curriculo = $curriculoDAO->idCurriculo;
				$informaticaDAO->save();
			}
			else{
				$informaticaDAO = ORM::factory('informaticadao');
				
				$informaticaDAO->conhecimentoEmInformatica = $informaticaCorrente->getConhecimentoEmInformatica();
				$informaticaDAO->nivelDoConhecimento = $informaticaCorrente->getNivelDoConhecimento();
				$informaticaDAO->id_curriculo = $curriculoDAO->idCurriculo;
				$informaticaDAO->save();
			}
				
			if(!$informaticaDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:309:BD:informatica");
			}
		}

		//Tentativa de adicionar os um-para-um com uma profundidade de relação maior a aqual a relação da ligação
		//seguinte é de um-para-muitos
		//Esta é uma correção de modelo imlementada com o propósito de generalizar e diminuir acoplamento e
		//complexidade
		//A correção de modelo aqui feita é sugerida para Escolaridade e Deficiência

		if($this->experienciaProfissional->getIdExperienciaProfissional() != 0){
			$experienciaProfissionalDAO = ORM::factory('experienciaprofissionaldao', $this->experienciaProfissional->getIdExperienciaProfissional());
		}
		else{
			$experienciaProfissionalDAO = ORM::factory('experienciaprofissionaldao');
		}
		
		$experienciaProfissionalDAO->possuiExperiencia = $this->experienciaProfissional->getPossuiExperiencia();

		//salva o experiência e automaticamente obtém a id inserida através de uma forma de last_insert_id()
		//que será usada para realizar as associações
		$experienciaProfissionalDAO->save();

		if($experienciaProfissionalDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:332:BD:experiencia");
		}

		//Verificando se há empresas em experiencia profissional e caso houver realizar as devidas associações
		//com a id de experiência obtida antes e inserir as empresas no Banco de Dados

		foreach ($this->experienciaProfissional->getEmpresas() as $empresa){

			if($empresa->getIdEmpresa() != 0){
				$empresaDAO = ORM::factory('empresadao', $empresa->getIdEmpresa());
				
				if($empresa->getNomeEmpresa() != ""){
					$empresaDAO->nomeEmpresa = $empresa->getNomeEmpresa();
					$empresaDAO->cargo = $empresa->getCargo();
					$empresaDAO->periodoInicio = $empresa->getPeriodoInicio();
					$empresaDAO->periodoFinal = $empresa->getPeriodoFinal();
					$empresaDAO->observacao = $empresa->getObservacao();
	
					//Realizando a associação de um-para-muitos de experienciaProfissional com Empresas
					//$empresaDAO->empresas_idExperienciaProfissional = $experienciaProfissionalDAO->idExperienciaProfissional;
					$empresaDAO->save();
	
					if($empresaDAO->saved()){
						$this->setOperacaoRealizada(true);
					}
					else{
						$this->setOperacaoRealizada(false);
						$this->setMensagemStatus("GDC:357:BD:empresa");
					}
				}
			}
			else{
				$empresaDAO = ORM::factory('empresadao');
				
				if($empresa->getNomeEmpresa() != ""){
					$empresaDAO->nomeEmpresa = $empresa->getNomeEmpresa();
					$empresaDAO->cargo = $empresa->getCargo();
					$empresaDAO->periodoInicio = $empresa->getPeriodoInicio();
					$empresaDAO->periodoFinal = $empresa->getPeriodoFinal();
					$empresaDAO->observacao = $empresa->getObservacao();
	
					//Realizando a associação de um-para-muitos de experienciaProfissional com Empresas
					$empresaDAO->empresas_idExperienciaProfissional = $experienciaProfissionalDAO->idExperienciaProfissional;
					$empresaDAO->save();
	
					if($empresaDAO->saved()){
						$this->setOperacaoRealizada(true);
					}
					else{
						$this->setOperacaoRealizada(false);
						$this->setMensagemStatus("GDC:357:BD:empresa");
					}
				}
			}
			
			
			
		}

		//como o curriculo possui uma associação de um-para-um com uma experiencia,
		//realizo a associação dela e suas empresas participantes
		//O curriculo foi instanciado como objeto DAO a partir do Banco de Dados na linha 161
		
		if($this->experienciaProfissional->getIdExperienciaProfissional() == 0){
			$curriculoDAO->experienciasProfissional_idExperienciaProfissional = $experienciaProfissionalDAO->idExperienciaProfissional;
		}
		
		$curriculoDAO->save();

		if($curriculoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:373:BD:curriculo");
		}


		//Entender melhor o Kohana, pois esta variável foi criada a principio para satizfazer o kohana,
		//que precisa ter um dado na tabela para inserir no Banco de Dados
		$possuiAtividade = "nao";

		$qtdCursos = count($this->atividadesComplementares->getCursos());
		$qtdAtividades = count($this->atividadesComplementares->getPalestras());
		$qtdVoluntariados = count($this->atividadesComplementares->getVoluntariados());
		$qtdAtividadesComplementares = count($this->atividadesComplementares->getAtividadesComplementares());

		if($qtdCursos > 0 || $qtdAtividades > 0 || $qtdVoluntariados > 0 || $qtdAtividadesComplementares > 0){
			$possuiAtividade = "sim";
		}

		if($this->atividadesComplementares->getIdAtividade() != 0){
			$atividadeDAO = ORM::factory('atividadedao', $this->atividadesComplementares->getIdAtividade());
			
			$atividadeDAO->possuiAtividade = $possuiAtividade;

			//Salva no banco de dados e obtém a id do objeto inserido para realizar as assiciações
			$atividadeDAO->save();
	
			if($atividadeDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:403:BD:atividade");
			}
	
			//Salvando a recém inserida atividade no curriculo pois a atividades possui associacao de um-para-um
			//Atividade como container de Atividades de variados tipos
			//$curriculoDAO->atividade_idAtividades = $atividadeDAO->idAtividades;
			$curriculoDAO->save();
		}
		else{
			$atividadeDAO = ORM::factory('atividadedao');
			
			$atividadeDAO->possuiAtividade = $possuiAtividade;

			//Salva no banco de dados e obtém a id do objeto inserido para realizar as assiciações
			$atividadeDAO->save();
	
			if($atividadeDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:403:BD:atividade");
			}
	
			//Salvando a recém inserida atividade no curriculo pois a atividades possui associacao de um-para-um
			//Atividade como container de Atividades de variados tipos
			
			$curriculoDAO->atividade_idAtividades = $atividadeDAO->idAtividades;
			$curriculoDAO->save();
		}
		

		if($curriculoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:416:BD:curriculo");
		}

		//Tentativa de inserir as Palestras da atividade - associação um para muitos
		//Modelo de implementação sugerida e realizada de acordo com os diagramas
		foreach ($this->atividadesComplementares->getPalestras() as $palestra){
				
			if($palestra->getIdPalestra() != 0){
				$palestraDAO = ORM::factory('palestradao', $palestra->getIdPalestra());
				
				$palestraDAO->tituloDaPalestra = $palestra->getTituloPalestra();
				//$palestraDAO->palestras_idAtividades = $atividadeDAO->idAtividades;
				$palestraDAO->save();
			}
			else{
				$palestraDAO = ORM::factory('palestradao');
				
				$palestraDAO->tituloDaPalestra = $palestra->getTituloPalestra();
				$palestraDAO->palestras_idAtividades = $atividadeDAO->idAtividades;
				$palestraDAO->save();
			}
			
				
			if($palestraDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:433:BD:palestra");
			}
		}

		foreach ($this->atividadesComplementares->getCursos() as $curso){

			if($curso->getIdCurso() != 0){
				$cursoDAO = ORM::factory('cursodao', $curso->getIdCurso());
				
				$cursoDAO->nomeDaAtividade = $curso->getNomeDoCurso();
				//$cursoDAO->atividade_fk = $atividadeDAO->idAtividades;
				$cursoDAO->save();
			}
			else{
				$cursoDAO = ORM::factory('cursodao');
				
				$cursoDAO->nomeDaAtividade = $curso->getNomeDoCurso();
				$cursoDAO->atividade_fk = $atividadeDAO->idAtividades;
				$cursoDAO->save();
			}
			
				
			if($cursoDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:449:BD:curso");
			}
		}

		foreach ($this->atividadesComplementares->getVoluntariados() as $voluntariado){
			
			if($voluntariado->getIdVoluntariado() != 0){
				$voluntariadoDAO = ORM::factory('voluntariadodao', $voluntariado->getIdVoluntariado());
				
				$voluntariadoDAO->nomeDaFuncao = $voluntariado->getNomeDaFuncao();
				//$voluntariadoDAO->voluntariados_idAtividades = $atividadeDAO->idAtividades;
				$voluntariadoDAO->save();
			}
			else{
				$voluntariadoDAO = ORM::factory('voluntariadodao');
				
				$voluntariadoDAO->nomeDaFuncao = $voluntariado->getNomeDaFuncao();
				$voluntariadoDAO->voluntariados_idAtividades = $atividadeDAO->idAtividades;
				$voluntariadoDAO->save();
			}
			
				
			if($voluntariadoDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:465:BD:voluntariado");
			}
		}

		foreach ($this->atividadesComplementares->getAtividadesComplementares() as $atividadeComplementar){
			
			if($atividadeComplementar->getIdAtividadeComplementar() != 0){
				$atividadeComplementarDAO = ORM::factory('atividadecomplementardao', $atividadeComplementar->getIdAtividadeComplementar());
				$atividadeComplementarDAO->nomeDaAtividade = $atividadeComplementar->getNomeDaAtividade();
				//$atividadeComplementarDAO->atividadesComplementares_idAtividades = $atividadeDAO->idAtividades;
				$atividadeComplementarDAO->save();
			}
			else{
				$atividadeComplementarDAO = ORM::factory('atividadecomplementardao');
				$atividadeComplementarDAO->nomeDaAtividade = $atividadeComplementar->getNomeDaAtividade();
				$atividadeComplementarDAO->atividadesComplementares_idAtividades = $atividadeDAO->idAtividades;
				$atividadeComplementarDAO->save();
			}
			

			if($atividadeComplementarDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:479:BD:atividadeComplementar");
			}
		}
	}
	
	
	
//Atualiza o curriculo de um candidato existente	
	public function curriculoUpdate(){
	$this->setMensagemStatus("Cadastro Atualizado com sucesso");
		echo "<br>CCR:499:MSG:" . $this->getMensagemStatus();
		//Obtendo os Objetos DAO para persistência do curriculo
		//Como aqui será alterado um registro existente, obtenho a abstração DAO do registro a ser alterado do BD
		//a partir de sua chave
		$candidatoDAO = ORM::factory('candidatodao', $this->candidato->getRg());
		
		echo "<br>CCR:505:MSG:" . $this->getMensagemStatus();
		//Modificando os dados pessoais
		$candidatoDAO->nome = $this->candidato->getNome();
		$candidatoDAO->email = $this->candidato->getEMail();
		$candidatoDAO->dataDeNascimento = $this->candidato->getDataDeNascimento();
		$candidatoDAO->sexo = $this->candidato->getSexo();
		$candidatoDAO->estadoCivil = $this->candidato->getEstadoCivil();
		$candidatoDAO->telefoneResidencial = $this->candidato->getTelefoneResidencial();
		$candidatoDAO->telefoneCelular = $this->candidato->getTelefoneCelular();
		$candidatoDAO->telefoneAuxiliar = $this->candidato->getOutrosTelefones();
		//$candidatoDAO->rg = $this->candidato->getRg();
		$candidatoDAO->cpf = $this->candidato->getCpf();
		//$candidatoDAO->candidatoStatus = 'INATIVO';
		$candidatoDAO->idade = DateUtil::calcularIdade($this->candidato->getDataDeNascimento());
		//TODO $candidatoDAO->nacionalidade = $this->candidato->getNacionalidade();
		
		
		//Modificando o endereço
		
		
		$enderecoDAO = ORM::factory('enderecodao', $candidatoDAO->endereco->idEndereco);
		
		$enderecoDAO->rua = $this->endereco->getRua();
		$enderecoDAO->numero = $this->endereco->getNumero();
		$enderecoDAO->bairro = $this->endereco->getBairro();
		$enderecoDAO->cep = $this->endereco->getCep();
		$enderecoDAO->complemento = $this->endereco->getComplemento();
		$enderecoDAO->cidade = $this->endereco->getCidade();
		$enderecoDAO->estado = $this->endereco->getEstado();
		$enderecoDAO->pais = $this->endereco->getPais();
		
		
		$enderecoDAO->save();
		echo "<br>CCR:531:MSG:" . $this->getMensagemStatus();
		//salva o endereço e automaticamente obtém a id inserida através de uma forma de last_insert_id()
		//$enderecoDAO->save();

		//verifica se o endereço foi salvo com sucesso no banco de dados
		/*if($enderecoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:92:BD:endereco");
		}*/

		//Atribuindo o endereço ao candidato - Associação um-para-um
		//$enderecoDAO_idEndereco = $enderecoDAO->idEndereco;

		//Instanciação do curriculo que sera usado a seguir nas associações dos formulários
		$curriculoDAO = ORM::factory('curriculodao', $candidatoDAO->curriculo->idCurriculo);

		$curriculoDAO->areaDeInteresse = $this->areaDeInteresse;

		//TODO - erro de modelo, informações adicionais ou complementares pertence ao curriculo e não a atividade
		//Corrigir erro no modelo
		$curriculoDAO->informacoesComplementares = $this->atividadesComplementares->getInformacoesComplementares();

		//salva o curriculo e automaticamente obtém a id inserida através de uma forma de last_insert_id()
		$curriculoDAO->save();

		//verifica se o curriculo foi salvo com sucesso no banco de dados
		if($curriculoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:116:BD:curriculo");
		}
		echo "<br>CCR:567:MSG:" . $this->getMensagemStatus();	
		//aplicando as relações em candidato com curriculo de um-para-um com curriculo
		//$candidatoDAO->curriculo_idCurriculo = $curriculoDAO->idCurriculo;

		//Não há mais relações associadas ao candidato daqui para frente
		//O candidato pode ser salvo em definitivo no Banco de Dados
		$candidatoDAO->save();

		//verifica se o candidato foi salvo com sucesso no banco de dados
		if($candidatoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:132:BD:candidato");
		}
		
		echo "<br>CCR:584:MSG:" . $this->getMensagemStatus();
		//Tentativa de adicionar deficiências captadas em um curriculo, havendo conhecimento que a chave estrangeira
		//está nas tablela filhas referenciando o id da tabela pai na relação de um-para-muitos
		//é adicionado esta ligação através do id obtido do curriculo que foi inserido acima
		//TODO pensar no ideal - talvez fosse melhor delegar ao DeficienciaDAO que conhece as suas associações
		//e dividir com os DAOs de dominio o trabalho de persistência que se encontra todo aqui
		//Atualmente as associações estão sendo realizadas praticamente manualmente, porém evitando as querys
		//usando a solução ORM do Kohana 3		
		
		$deficienciasAux = $candidatoDAO->curriculo->deficiencia->find_all();
		
		foreach ($deficienciasAux as $deficienciaAux){
			$deficienciaAux->dificuldadedevidodeficienciaintelectual->delete_all();
		}
		
		$candidatoDAO->curriculo->deficiencia->delete_all();
		
		foreach ($this->deficiencias as $deficiencia){
			//a deficiencia foi previamente serializada no controle do formularia de deficiência - realizando a desserialização
			$defCorrente = unserialize($deficiencia);
				
			$deficienciaDAO = ORM::factory('deficienciadao');
			echo "<br>CCR:627:MSG:ELSEDEF " . $this->getMensagemStatus();
			//verificando qual campo foi preenchido devido ao tipo diferente de deficiência
			//TODO modelo alterado de forma a generalizar e melhorar este modelo
			//@post: Impacto de implementação - deverá levar de 1 a 3 dias para implementar novo modelo
			if($defCorrente->getTipoDeficiencia() != null && $defCorrente->getTipoDeficiencia() != ""){
				$deficienciaDAO->tipoDeDeficiencia = $defCorrente->getTipoDeficiencia();
			}
			if($defCorrente->getModalidadeDaDeficiencia() != null && $defCorrente->getModalidadeDaDeficiencia() != ""){
				$deficienciaDAO->modalidadeDaDeficiencia = $defCorrente->getModalidadeDaDeficiencia();
			}
			if($defCorrente->getIntensidadeDaDeficiencia() != null && $defCorrente->getIntensidadeDaDeficiencia() != ""){
				$deficienciaDAO->intensidadeDaDeficiencia = $defCorrente->getIntensidadeDaDeficiencia();
			}
			if($defCorrente->getOutraModalidadeDeficiencia() != null && $defCorrente->getOutraModalidadeDeficiencia() != ""){
				$deficienciaDAO->outraModalidadeDeficiencia = $defCorrente->getOutraModalidadeDeficiencia();
			}
				
			if($defCorrente->getObservacoes() != null && $defCorrente->getObservacoes() != ""){
				$deficienciaDAO->observacoes = $defCorrente->getObservacoes();
			}

			//Para cada deficiencia inserida associo ao curriculo corrente na associação um-para-muitos
			$deficienciaDAO->id_curriculo = $curriculoDAO->idCurriculo;
			//insiro a deficiencia desta rodada no banco de dados
			$deficienciaDAO->save();
							
			//Por culpa do modelo mal feito aparecem coisas estranhas como este foreach dentro de outro foreach!
			//Este foi inserido por atualização do modelo pois Hibernate não lida com List de String e sim de EDs criadas
			$qtdDificuldade = count($defCorrente->getDificuldadesDevidoDeficiencia());
			if($defCorrente->getDificuldadesDevidoDeficiencia() != null && $qtdDificuldade > 0){
				$dificuldades = $defCorrente->getDificuldadesDevidoDeficiencia();
				foreach ($dificuldades as $dificuldade){
					
					$dificuldadeDAO = ORM::factory('dificuldadedevidodeficienciaintelectualdao');
					$dificuldadeDAO->dificuldadeDevidoDeficiencia = $dificuldade->getDificuldadeDevidoDevidoDeficiencia();
					$dificuldadeDAO->deficiencia_Dificuldade = $deficienciaDAO->idDeficiencia;
					$dificuldadeDAO->save(); //será!?^^

					if($dificuldadeDAO->saved()){
						$this->setOperacaoRealizada(true);
					}
					else{
						$this->setOperacaoRealizada(false);
						$this->setMensagemStatus("GDC:186:BD:dificuldade");
					}
				}
				//$deficienciaDAO->dificuldadesDevidoDeficiencia = $defCorrente->getDificuldadesDevidoDeficiencia();
			}
			

			//verifico a ocorrencia de erro na inserção em cada rodada
			//Pensar se é necessário break para encerrar o loop imediatamente
			if($deficienciaDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:199:BD:deficiencia");
			}
		}

		//Questões levantadas: - Um meio de efetuar um rollback de todas as operações pois caso ocorresse um erro
		//em qualquer uma dessas inserções elas deveriam levar em conta a atomicidade da operação, e aqui ao
		//inserir um candidato a operação deveria ser atômica para o candidato e todos os seus elementos, o
		//que aqui não está garantido

		//Tentativa de inserir as escolaridades, possuindo as mesmas condições e os mesmos erros e problemas de
		//modelo apresentados na inserção de deficiência realizada anteriormente
		
		$candidatoDAO->curriculo->escolaridade->delete_all();

		foreach ($this->escolaridade as $escolaridade){
			//a escolaridade foi previamente serializada no controle do formularia de deficiência - realizando a desserialização
			$escolaridadeCorrente = unserialize($escolaridade);
				
			$escolaridadeDAO = ORM::factory('escolaridadedao');

			//verificando qual campo foi preenchido devido ao tipo diferente de escolaridades
			//TODO modelo alterado de forma a generalizar e melhorar este modelo
			//@post: Impacto de implementação - deverá levar de 1 a 3 dias para implementar novo modelo
			if($escolaridadeCorrente->getEscolaridade() != null && $escolaridadeCorrente->getEscolaridade() != ""){
				$escolaridadeDAO->escolaridade = $escolaridadeCorrente->getEscolaridade();
			}
			if($escolaridadeCorrente->getGrauDaEscolaridade() != null && $escolaridadeCorrente->getGrauDaEscolaridade() != ""){
				$escolaridadeDAO->grauDaEscolaridade = $escolaridadeCorrente->getGrauDaEscolaridade();
			}
			if($escolaridadeCorrente->getAnoDeConclusao() != null && $escolaridadeCorrente->getAnoDeConclusao() != ""){
				$escolaridadeDAO->anoDeConclusao = $escolaridadeCorrente->getAnoDeConclusao();
			}
			if($escolaridadeCorrente->getInstituicao() != null && $escolaridadeCorrente->getInstituicao() != ""){
				$escolaridadeDAO->instituicao = $escolaridadeCorrente->getInstituicao();
			}
			if($escolaridadeCorrente->getCurso() != null && $escolaridadeCorrente->getCurso() != ""){
				$escolaridadeDAO->curso = $escolaridadeCorrente->getCurso();
			}
			if($escolaridadeCorrente->getTipoDeEnsinoMedio() != null && $escolaridadeCorrente->getTipoDeEnsinoMedio() != ""){
				$escolaridadeDAO->tipoDeEnsinoMedio = $escolaridadeCorrente->getTipoDeEnsinoMedio();
			}
			if($escolaridadeCorrente->getTipoDeEnsinoPosGraduacao() != null && $escolaridadeCorrente->getTipoDeEnsinoPosGraduacao() != ""){
				$escolaridadeDAO->tipoDeEnsinoPosGraduacao = $escolaridadeCorrente->getTipoDeEnsinoPosGraduacao();
			}
			//Para cada escolaridade inserida associo ao curriculo corrente na associação um-para-muitos
			$escolaridadeDAO->id_curriculo = $curriculoDAO->idCurriculo;
			//insiro a escolaridade desta rodada no banco de dados
			$escolaridadeDAO->save();



			if(!$escolaridadeDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:247:BD:idioma");
			}
		}
		
		$candidatoDAO->curriculo->idioma->delete_all();

		//Tentativa de inserir os idiomas, possuindo um modelo melhor definido com a captura de modelo baseado no modelo visual de
		//formulário do mesmo - curriculo com idiomas segue o modelo um-para-muitos
		foreach ($this->idiomas as $idioma){
			//o idioma foi previamente serializado no controle do formulario de deficiência - realizando a desserialização
			$idiomaCorrente = unserialize($idioma);
			//Representação do banco de dados em objeto

			$idiomaDAO = ORM::factory('idiomadao');

			$idiomaDAO->nomeDoIdioma = $idiomaCorrente->getNomeDoIdioma();
			$idiomaDAO->le = $idiomaCorrente->getLe();
			$idiomaDAO->escreve = $idiomaCorrente->getEscreve();
			$idiomaDAO->fala = $idiomaCorrente->getFala();
			$idiomaDAO->entende = $idiomaCorrente->getEntende();
			//Para cada idioma inserido associo ao curriculo corrente na associação um-para-muitos
			$idiomaDAO->id_curriculo = $curriculoDAO->idCurriculo;
			//insiro o idioma desta rodada no banco de dados
			$idiomaDAO->save();

			if(!$idiomaDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:271:BD:idioma");
			}
		}
		
		$candidatoDAO->curriculo->comunicacao->delete_all();

		//Tentativa de inserir a comunicação seguindo o modelo de um-para-muitos com relação ao curriculo
		foreach ($this->comunicacao as $comunicacao){
			$comunicacaoCorrente = unserialize($comunicacao);
				
			$comunicacaoDAO = ORM::factory('comunicacaodao');

			$comunicacaoDAO->meioDeComunicacao = $comunicacaoCorrente->getMeioDeComunicacao();
			if($comunicacaoCorrente->getOutros() != null && $comunicacaoCorrente->getOutros() != ""){
				$comunicacaoDAO->outros = $comunicacaoCorrente->getOutros();
			}
			//Para cada comunicação inserida associo ao curriculo corrente na associação um-para-muitos
			$comunicacaoDAO->comunicacao_idCurriculo = $curriculoDAO->idCurriculo;
			//insiro a comunicação desta rodada no banco de dados
			$comunicacaoDAO->save();

			if(!$comunicacaoDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:291:BD:comunicacao");
			}
		}

		$candidatoDAO->curriculo->informatica->delete_all();
		
		//Tentativa de inserção de informática, segue o mesmo modelo de idioma
		//elaboração de modelo e implementação mais simplificados
		//objetos serializados e o array de objetos em seguida também serializados como todos os anteriores
		foreach ($this->informatica as $informatica){
			$informaticaCorrente = unserialize($informatica);
				
			$informaticaDAO = ORM::factory('informaticadao');

			$informaticaDAO->conhecimentoEmInformatica = $informaticaCorrente->getConhecimentoEmInformatica();
			$informaticaDAO->nivelDoConhecimento = $informaticaCorrente->getNivelDoConhecimento();
			$informaticaDAO->id_curriculo = $curriculoDAO->idCurriculo;
			$informaticaDAO->save();

			if(!$informaticaDAO->saved()){
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:309:BD:informatica");
			}
		}

		//Tentativa de adicionar os um-para-um com uma profundidade de relação maior a aqual a relação da ligação
		//seguinte é de um-para-muitos
		//Esta é uma correção de modelo imlementada com o propósito de generalizar e diminuir acoplamento e
		//complexidade
		//A correção de modelo aqui feita é sugerida para Escolaridade e Deficiência
		
		$idExperienciaProfissional = $candidatoDAO->curriculo->experienciaprofissional->idExperienciaProfissional;
		$this->experienciaProfissional->setIdExperienciaProfissional($idExperienciaProfissional);
		if($idExperienciaProfissional != 0){
			$experienciaProfissionalDAO = ORM::factory('experienciaprofissionaldao', $idExperienciaProfissional);
		}
		else{
			$experienciaProfissionalDAO = ORM::factory('experienciaprofissionaldao');
		}
		
		$experienciaProfissionalDAO->possuiExperiencia = $this->experienciaProfissional->getPossuiExperiencia();

		//salva o experiência e automaticamente obtém a id inserida através de uma forma de last_insert_id()
		//que será usada para realizar as associações
		$experienciaProfissionalDAO->save();

		if($experienciaProfissionalDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:332:BD:experiencia");
		}
		
		$candidatoDAO->curriculo->experienciaprofissional->empresa->delete_all();

		//Verificando se há empresas em experiencia profissional e caso houver realizar as devidas associações
		//com a id de experiência obtida antes e inserir as empresas no Banco de Dados

		foreach ($this->experienciaProfissional->getEmpresas() as $empresa){

			$empresaDAO = ORM::factory('empresadao');

			if($empresa->getNomeEmpresa() != ""){
				$empresaDAO->nomeEmpresa = $empresa->getNomeEmpresa();
				$empresaDAO->cargo = $empresa->getCargo();
				$empresaDAO->periodoInicio = $empresa->getPeriodoInicio();
				$empresaDAO->periodoFinal = $empresa->getPeriodoFinal();
				$empresaDAO->observacao = $empresa->getObservacao();

				//Realizando a associação de um-para-muitos de experienciaProfissional com Empresas
				$empresaDAO->empresas_idExperienciaProfissional = $experienciaProfissionalDAO->idExperienciaProfissional;
				$empresaDAO->save();

				if($empresaDAO->saved()){
					$this->setOperacaoRealizada(true);
				}
				else{
					$this->setOperacaoRealizada(false);
					$this->setMensagemStatus("GDC:357:BD:empresa");
				}
			}
			
		}

		//como o curriculo possui uma associação de um-para-um com uma experiencia,
		//realizo a associação dela e suas empresas participantes
		//O curriculo foi instanciado como objeto DAO a partir do Banco de Dados na linha 161
		
		if($this->experienciaProfissional->getIdExperienciaProfissional() == 0){
			$curriculoDAO->experienciasProfissional_idExperienciaProfissional = $experienciaProfissionalDAO->idExperienciaProfissional;
		}
		
		$curriculoDAO->save();

		if($curriculoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:373:BD:curriculo");
		}


		//Entender melhor o Kohana, pois esta variável foi criada a principio para satizfazer o kohana,
		//que precisa ter um dado na tabela para inserir no Banco de Dados
		$possuiAtividade = "nao";

		$qtdCursos = count($this->atividadesComplementares->getCursos());
		$qtdAtividades = count($this->atividadesComplementares->getPalestras());
		$qtdVoluntariados = count($this->atividadesComplementares->getVoluntariados());
		$qtdAtividadesComplementares = count($this->atividadesComplementares->getAtividadesComplementares());

		if($qtdCursos > 0 || $qtdAtividades > 0 || $qtdVoluntariados > 0 || $qtdAtividadesComplementares > 0){
			$possuiAtividade = "sim";
		}
		$this->atividadesComplementares->setIdAtividade($candidatoDAO->curriculo->atividade->idAtividades);
		if($this->atividadesComplementares->getIdAtividade() != 0){
			$atividadeDAO = ORM::factory('atividadedao', $candidatoDAO->curriculo->atividade->idAtividades);
			
			$atividadeDAO->possuiAtividade = $possuiAtividade;

			//Salva no banco de dados e obtém a id do objeto inserido para realizar as assiciações
			$atividadeDAO->save();
	
			if($atividadeDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:403:BD:atividade");
			}
	
			//Salvando a recém inserida atividade no curriculo pois a atividades possui associacao de um-para-um
			//Atividade como container de Atividades de variados tipos
			//$curriculoDAO->atividade_idAtividades = $atividadeDAO->idAtividades;
			$curriculoDAO->save();
		}
		else{
			$atividadeDAO = ORM::factory('atividadedao');
			
			$atividadeDAO->possuiAtividade = $possuiAtividade;

			//Salva no banco de dados e obtém a id do objeto inserido para realizar as assiciações
			$atividadeDAO->save();
	
			if($atividadeDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:403:BD:atividade");
			}
	
			//Salvando a recém inserida atividade no curriculo pois a atividades possui associacao de um-para-um
			//Atividade como container de Atividades de variados tipos
			
			$curriculoDAO->atividade_idAtividades = $atividadeDAO->idAtividades;
			$curriculoDAO->save();
		}
		

		if($curriculoDAO->saved()){
			$this->setOperacaoRealizada(true);
		}
		else{
			$this->setOperacaoRealizada(false);
			$this->setMensagemStatus("GDC:416:BD:curriculo");
		}
		
		$candidatoDAO->curriculo->atividade->palestra->delete_all();

		//Tentativa de inserir as Palestras da atividade - associação um para muitos
		//Modelo de implementação sugerida e realizada de acordo com os diagramas
		foreach ($this->atividadesComplementares->getPalestras() as $palestra){
				
			$palestraDAO = ORM::factory('palestradao');

			$palestraDAO->tituloDaPalestra = $palestra->getTituloPalestra();
			$palestraDAO->palestras_idAtividades = $atividadeDAO->idAtividades;
			$palestraDAO->save();

			if($palestraDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:433:BD:palestra");
			}
		}
		
		$candidatoDAO->curriculo->atividade->curso->delete_all();

		foreach ($this->atividadesComplementares->getCursos() as $curso){

			$cursoDAO = ORM::factory('cursodao');

			$cursoDAO->nomeDaAtividade = $curso->getNomeDoCurso();
			$cursoDAO->atividade_fk = $atividadeDAO->idAtividades;
			$cursoDAO->save();

			if($cursoDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:449:BD:curso");
			}
		}
		
		$candidatoDAO->curriculo->atividade->voluntariado->delete_all();

		foreach ($this->atividadesComplementares->getVoluntariados() as $voluntariado){
				
			$voluntariadoDAO = ORM::factory('voluntariadodao');

			$voluntariadoDAO->nomeDaFuncao = $voluntariado->getNomeDaFuncao();
			$voluntariadoDAO->voluntariados_idAtividades = $atividadeDAO->idAtividades;
			$voluntariadoDAO->save();

			if($voluntariadoDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:465:BD:voluntariado");
			}
		}
		
		$candidatoDAO->curriculo->atividade->atividadecomplementar->delete_all();

		foreach ($this->atividadesComplementares->getAtividadesComplementares() as $atividadeComplementar){
				
			$atividadeComplementarDAO = ORM::factory('atividadecomplementardao');
			$atividadeComplementarDAO->nomeDaAtividade = $atividadeComplementar->getNomeDaAtividade();
			$atividadeComplementarDAO->atividadesComplementares_idAtividades = $atividadeDAO->idAtividades;
			$atividadeComplementarDAO->save();

			if($atividadeComplementarDAO->saved()){
				$this->setOperacaoRealizada(true);
			}
			else{
				$this->setOperacaoRealizada(false);
				$this->setMensagemStatus("GDC:479:BD:atividadeComplementar");
			}
		}
	}

	/******************
	 * GETTERS/SETTERS
	 *****************/
	public function isOperacaoRealizada(){
		return $this->OperacaoRealizada;
	}
	
	public function setOperacaoRealizada($operacaoRealizada){
		$this->OperacaoRealizada = $operacaoRealizada;
	}
	
	public function getMensagemStatus(){
		return $this->mensagemStatusInsercao;
	}
	
	public function setMensagemStatus($mensagemStatus){
		$this->mensagemStatusInsercao = $mensagemStatus;
	}
	
	
}
?>